/*
 * ArchivosUtil.h
 *
 *  Created on: 02/09/2012
 *      Author: marcos
 */

#ifndef ARCHIVOSUTIL_H_
#define ARCHIVOSUTIL_H_

#include <iostream>
#include <ctype.h>
#include <vector>
#include <string.h>
#include <algorithm>
#include <fstream>
#include <dirent.h>
#include <sys/types.h>
#include <math.h>
#include <map>
#include <iostream>
#include <iterator>
#include "../constantes/Constantes.h"
#include "../utiles/StringUtil.h"
#include "../entidades/TerminoIndexado.h"
#include "../utiles/TerminoUtil.h"

using namespace std;

class ArchivosUtil {
public:
	ArchivosUtil();
	double llenarVectorTerminos(string entrada, vector<TerminoIndexado> &vecTerminos, int numDoc);
	bool generarArchivoInicialDesdeDirectorio(string rutaDocumento, string salid,string rutaReferencias,string nombreIndice);
	//bool generarArchivoAuxiliar(string entrada, string salida);
	bool esTermino(string cadena);
	vector<string> devolverTerminos(string linea);
	virtual ~ArchivosUtil();
	void tratarSeguimiento(char* linea,vector<string>* result);
	int getCantBloques();
	void setCantBloques(int cant);
	double getCantBytes();
	void setCantBytes(double cant);
	void ordenarUnBloque(string nombreBloque);
	//void generarMatriz(string nombreDirectorio, string nombreSalida, char modo);
	int getCantDocumentos();
	void mergeSalidas(string rutaDirectorio,string nombreIndice);
	vector<string*> devolverVectorTerminos(string rutaDirectorio);
	vector<string> obtenerTodasPalabras(string rutaArchivo);
	string obtenerNombreDocumento(string rutaReferencias,int numeroDoc);
	void borrarMergeSalidas(string rutaDirectorio);
private:
	int cantDocumentos;
	int cantBloques;
	double cantBytes;
	static bool sigue;
	static string auxs;
	static int ultimoCompuesto;
	bool agregarReferencia(string nomrebArchivo,string rutaReferencias,int index);
	bool esCaracterValido(char* caracter);
	bool esAlfanumerico(char* caracter);
	bool esSeguidoDeEspacio(char* linea,int i);
	bool esCompuestaEntreCaracteres(char* linea,int i,vector<string>* result);
	bool esTerminoCorrecto(char* linea);
	//RegistroAuxiliar parsearArchivoAux(char* linea);
	bool cierraCompuesto(char* linea);
	//bool volcarDatosArchivoAuxiliar(vector<RegistroAuxiliar> vectorAEscribir,	string archivoSalida);
	int cantidadDigitos(int entrada);

	vector<TerminoIndexado> completarVectorDeTerminos(vector<TerminoIndexado> vecTerminos);
	//bool sortingVector(RegistroAuxiliar registro1, RegistroAuxiliar registro2);
	//void generarMatrizXBooleano(string nombreDirectorio, string nombreSalida);
	//void generarMatrizXCantidad(string nombreDirectorio, string nombreSalida);
	//void generarMatrizXTfIdf(string nombreDirectorio, string nombreSalida);
	//void llenarVectorFrecuenciasMaximas(string nombreDirectorio, long* vec);
	vector <std::ifstream *> obtenerFileHandlersDeDirectorio(string rutaDirectorio);
	TerminoIndexado obtenerSiguienteTerminoIndexadoDeArchivo(std::ifstream* archivoEntrada);
	TerminoIndexado parsearArchivoAux(vector<char> linea);
	void escribirEnSalidaMerge(ofstream &salida,TerminoIndexado registroActual,std::map<int, std::vector<int> > &mapDocsPosicionesAnterior);
	void borrarSalidas(string rutaDirectorio);
	void borrarReferencias(string rutaDirectorio);
	void borrarMergeSalidasPalabras(string rutaDirectorio,string nombreIndice);
};

#endif /* ARCHIVOSUTIL_H_ */

